package com.cskaoyan.javase.oop1._1basic;

/**
 * 类和对象的基本语法
 * 如何定义类？如何创建对象？
 * 这里给出一个案例：
 * 创建学生对象，然后访问学生对象的属性，使用学生对象的行为。
 * 要想创建学生对象，首先需要创建对象的"模板"——学生类，那么如何得到一个学生类呢？
 * 类的定义：
 * 定义类包括定义类本身，和定义类中结构两部分。
 * 1.类本身结构的定义
 * 语法：
 *  [类修饰符列表] class 类名{
 *      // 类体
 *  }
 *  解释：
 *  1.定义一个类必须写在一个Java文件里
 *  2.可以用来修饰类的修饰符并不多，但是这里我们还没有学习
 *      但是我们已经知道了一个类可以有两种定义方式：
 *      a.public class 类名必须和java文件名保持一致，且一个Java文件下只有一个
 *      b.非public class 类名没有限制，且个数也不限
 *      一个Java文件下多个class都是同包关系，同包下不允许出现同名类
 *  3.class是一个关键字，表示定义一个类
 *  4.类名应该遵循大驼峰式的命名规范，类名要"见名知意"，而且一般来说类表示对实体的抽象，往往使用名词
 *
 *  约定：
 *  在实际开发中，几乎很少会定义非public class
 *  一般都是一个Java文件下一个Java类
 *  但是为了上课方便大家看代码，所以我们会定义public class Demo作为测试类
 *  然后在下面定义非public class作为被测试类
 *
 *  注意事项：
 *  1.类名后面跟的大括号是类体，不是代码块，它里面定义的变量也不是局部变量
 *  2.Java的方法是不能嵌套定义的，但是Java类是可以嵌套定义的
 *      这种嵌套定义在另一个类的类体当中的类，称之为"内部类"
 *      内部类是Java面向对象当中较为复杂的语法，后面会学习
 *      这里请大家暂时不要定义"内部类"
 *      定义类时，一定要看清楚大括号，不要嵌套定义！
 *
 * 2.类中结构的定义
 * 类是创建对象的模板，那么就应该能够描述一种类别的全体对象，所以：
 * 类这种模板要抽取出全体对象的共性属性来定义
 *
 * 1.在Java语法中，用"成员变量"来描述全体对象的属性共性
 * 什么是成员变量呢？
 * 什么是局部变量呢？
 * 定义在方法体、大括号等作用域内部类的一个变量称之为局部变量，局部变量仅在作用域内部生效
 * 局部变量定义在局部位置。
 * 那么：
 * 定义在成员位置的变量就称之为成员变量。
 * 成员位置：类体当中，局部位置之外的区域就是成员位置。
 * 成员变量的语法：
 * [修饰符列表] 数据类型 变量名;
 * 注：
 * 修饰符列表没学，默认为空，什么都不写。
 * 数据类型可以是基本数据类型，也可以是引用数据类型
 *
 * 2.在Java语法中，用"成员方法"来描述全体对象的行为共性。
 * 成员方法：指的是定义在成员位置的，修饰符列表没有static的方法。
 * 语法：
 * [修饰符列表] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 注：
 * 方法的修饰符还没有学习，这里默认是"public"
 * 不能用static修饰
 * 加了static修饰的方法 不能称之为"成员方法"
 *
 * 以上就完成了类的定义。
 *
 * 那么如果通过类这个模板来得到创建一个对象呢？
 * 创建对象的位置：一般是在方法内部，在能够创建对象的位置（有权限）。
 *
 * 创建对象的语法：
 * 类名 对象名 = new 类名();
 * 解释：
 * 左边其实就是引用数据类型变量的声明
 * 类名表示引用数据类型变量的数据类型
 * 对象名是一个引用，存储在方法栈帧中，是一个局部变量
 * 和数组名类似
 *
 * 右边是引用数据类型变量的初始化
 * new关键字表示创建对象，在堆上创建对象
 * 类名表示创建的是何种类型的对象
 *
 * 等号连接
 * 对象是实质，引用只是存储地址，间接访问对象
 * 和之前数组变量的初始化有类似之处。
 *
 * 对象创建完毕后开始操作这个对象
 *
 * 访问属性（获取属性值和修改属性值）
 * 语法：
 * 数据类型 变量名 = 对象名.成员变量;
 * 通过上述方式就可以直接获取属性值了，修改属性值也是类似的做法：
 * 对象名.成员变量 = 值;
 *
 * 注：对象中的成员变量，类似于数组对象中的元素，它们都具有默认初始化和默认值！！！
 * 而具体默认值是什么，也和数组对象中的元素一致
 * 对象的成员变量的赋值顺序,赋值结果是面向对象阶段一个非常重要的知识点
 * 现在先明确:
 * 不管有多少种赋值方式,默认初始化具有默认值是永远最先进行的
 * 任何其它赋值手段,都是在默认值的基础上完成赋值的
 *
 * 补充: 能够用"对象名."直接访问成员变量,是在有权限的前提下,才能够这么做.
 *
 *
 * 调用行为（方法）
 * 语法：
 * 对象名.成员方法名(实参);
 * 如果方法有返回值，还可以接收返回值。
 * 成员方法的调用和之前说的static方法的调用没有本质上的区别
 *
 * 总结:
 * 思考:
 *      1.对象中成员变量和成员方法,如果不创建对象能够直接使用吗?
 *      不能够直接使用,类中的成员变量和成员方法,统称为类的成员(普通成员),它们是属于对象的
 *      必须创建对象之后才能够使用
 *
 *      2.既然类的成员是属于对象的,那么不同对象的成员变量和成员方法一致吗?
 *      当然不一致
 *      对象中的成员变量就直接存储在对象当中
 *      不同的对象,成员变量不同
 *      不同对象的成员方法也可能有所不同
 *          因为成员方法可以访问自身对象的成员变量
 *          而成员变量的取值可能不同
 *
 * 补充:
 *      1.static修饰的方法之间可以互相调用
 *      但是static方法当中不能去直接调用成员方法
 *
 *      2.成员方法之间也是可以互相调用的
 *
 *
 * @since 14:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// 测试类
public class Demo {
    public static void main(String[] args) {
        // 创建Student对象
        // Student s;
        // System.out.println(s);

        /*Student s = new Student();
        // 对象的操作
        // 访问对象的属性
        System.out.println(s.age);
        System.out.println(s.name);
        System.out.println(s.score);
        s.age = 18;
        System.out.println(s.age);
        s.sleep();
        s.study();

        Student s2 = new Student();
        System.out.println(s2.age);
        s2.study();*/

        Student s1 = new Student();
        s1.name = "张三";
        Student s2 = new Student();
        s2.name = "李四";

        s1.study();
        s2.study();

    }

    // 嵌套内部类，不要定义它
    class A {
    }
}

// 定义一个学生类
class Student {
    /*
        成员位置
        抽取出全体学生对象的共性属性
        得到成员变量
     */
    String name;
    double score;
    String grade;
    int age;
    int stuId;

    /*public static void test(){
        study();
    }*/

    /*
        抽取出全体学生对象的共性行为
        得到成员方法
     */
    public void study() {
        // eat();
        // 成员方法当中,可以直接访问本类中的成员变量
        System.out.println("学习使" + name + "快乐！");
    }

    public void eat() {
        // study();
        System.out.println("吃完饭就学习！");
    }

    public void sleep() {
        System.out.println("你这个年纪段，你怎么睡得着的？学习！");
    }


}
